package com.cgrs572.shortlink.project.config;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 *  Sentinel 规则配置类用来初始化限流配置，会在 Spring 应用启动时 动态加载流量控制规则
 * 由于该配置继承了InitializingBean,所以在Spring的Bean初始化完成后自动触发 afterPropertiesSet()方法，使得Sentinal将该规则加载进去
 */
// 扫描并注册为 SpringIoC 容器中的 Bean
@Component
public class SentinelRuleConfig implements InitializingBean {

    /**
     * 注意：此处只对某一个方法进行了流控，若想要对多个方法进行流控可创建FlowRule对象设置之后添加到规则容器中即可
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        List<FlowRule> rules = new ArrayList<>(); // 创建规则容器
        // 对某一个方法进行流控
        FlowRule createOrderRule = new FlowRule(); // 创建流控规则
        createOrderRule.setResource("create_short-link"); // 指定资源名
        createOrderRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//设置限流规则为QPS（代表每秒查询数）
        createOrderRule.setCount(1);//设置访问频率（即访问上线，每秒只能查询一个）

        rules.add(createOrderRule); // 将创建的流控规则添加到规则容器中
        FlowRuleManager.loadRules(rules); // 将规则容器中的流控规则加载到Sentinel运行时环境
    }
}
